// 封装通用的接口调用模块
import axios from 'axios'
import store from '@/store'
import router from '@/router'
import { removeToken } from './auth'

// 基准地址
// const baseURL = '/dev-api'
// const baseURL = 'http://ihrm-java.itheima.net/api'
const baseURL = process.env.VUE_APP_BASE_API

// 创建一个独立的实例
const instance = axios.create({
  baseURL: baseURL
})

// 添加响应拦截器
instance.interceptors.response.use(res => {
  // res.data表示后端返回的原始数据
  return res.data
}, (err) => {
  // 判断是否为token失效的问题
  if (err.response.status === 401 && err.response.data.code === 10002) {
    // token已经失效，删除用户的token，跳转到登录页面
    store.commit('user/SET_TOKEN', '')
    store.commit('user/updateUserInfo', null)
    removeToken()
    // 跳转到登录页面
    router.push('/login')
  }
  return Promise.reject(err)
})

// 添加请求拦截器
instance.interceptors.request.use(config => {
  // 添加请求头：如果token是存在的，就添加
  // const token = store.state.user.token
  const token = store.getters.token
  if (token) {
    config.headers.Authorization = `Bearer ${token}`
    // 不建议按照如下的方式写
    // config.headers = {
    //   Authorization: `Bearer ${token}`
    // }
  }
  return config
}, (err) => {
  return Promise.reject(err)
})

// export default instance

// 封装通用的接口调用函数
// 按照这种方式封装时，无论何种请求方式，参数都用data传递，更加方便
export default (options) => {
  let key = null
  if (options.method) {
    // method属性是存在的
    key = options.method.toUpperCase() === 'GET' ? 'params' : 'data'
  } else {
    // 如果没有传递method属性，默认采用get请求方式
    key = 'params'
  }
  return instance({
    // 短路运算
    method: options.method || 'get',
    url: options.url,
    // data用于传递除get之外的所有请求方式的数据：post/put/delete
    // data: options.data,
    // params仅仅处理get请求参数
    // params: options.params
    // ES6规则：对象的key可以是动态的变量
    [key]: options.data
  })
}
